﻿using System;
using System.IO;
using System.Collections.Generic;

namespace compilador
{
    class CodMaquina
    {
        public static void GeraCR(ItemSimboloTS i, Simbolos TS) 
        {
            if (i.Token.Equals(TipoToken.t_identificador))
            {
                CodMaquina.InsereCodigo("CRVL", TS.ObtemPosMem(i.Lexema));
            }
            else
            {
                CodMaquina.InsereCodigo("CRCT", Convert.ToDouble(i.Lexema));
            }
        }
        public static void GeraOperadorR(TipoToken operador)
        {
            switch (operador)
            {
                case TipoToken.t_igual:
                    InsereCodigo("CPIG");
                    break;
                case TipoToken.t_diferente:
                    InsereCodigo("CDES");
                    break;
                case TipoToken.t_maior:
                    InsereCodigo("CPMA");
                    break;
                case TipoToken.t_maiorigual:
                    InsereCodigo("CMAI");
                    break;
                case TipoToken.t_menor:
                    InsereCodigo("CPME");
                    break;
                case TipoToken.t_menorigual:
                    InsereCodigo("CPMI");
                    break;
            }
        }

        public static List<string> ListaCod = new List<string>();
        public static int InsereCodigo(string aCodigo)
        {
            ListaCod.Add(aCodigo);
            return ListaCod.Count -1;
        }

        public static void AlteraComando(int aIndice, string aCodigo, int aEndereco)
        {
            ListaCod[aIndice] = aCodigo + ' ' + Convert.ToString(aEndereco);
        }

        public static int InsereCodigo(string aCodigo, int aEndereco)
        {
            ListaCod.Add(aCodigo+' '+Convert.ToString(aEndereco));
            return ListaCod.Count - 1;
        }

        public static int InsereCodigo(string aCodigo, double aEndereco)
        {
            ListaCod.Add(aCodigo + ' ' + Convert.ToString(aEndereco));
            return ListaCod.Count - 1;
        }
       

        public static int ObtemPosicaoArquivo()
        {
            return ListaCod.Count - 1;
        }

        public static void Clear()
        {
            ListaCod.Clear();
        }

        public static void SalvarEmArquivo(string aNomeArquivo)
        {
            FileStream fs = new FileStream(aNomeArquivo,FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            foreach (string s in ListaCod)
            {
                sw.WriteLine(s);
            }
            sw.Close();
            fs.Close();

        }

    }
}
